// import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
// import com.alibaba.druid.sql.ast.SQLExpr;
// import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.List;

#include "OracleDataTypeIntervalDay.h"
#include "../../../ast/SQLExpr.h"
#include "../visitor/OracleASTVisitor.h"
#include "../../../visitor/SQLASTVisitor.h"
#include "../../../../utils/listTran.h"

OracleDataTypeIntervalDay::OracleDataTypeIntervalDay()
{
  this->setName(make_string_ptr("INTERVAL DAY"));
  fractionalSeconds = std::make_shared<std::list<SQLExpr_ptr>>();
}

// @Override
void OracleDataTypeIntervalDay::accept0(SQLASTVisitor_ptr visitor)
{
  this->accept0(std::dynamic_pointer_cast<OracleASTVisitor>(visitor));
}

// @Override
void OracleDataTypeIntervalDay::accept0(OracleASTVisitor_ptr visitor)
{
  if (visitor->visit(SharedObject(OracleDataTypeIntervalDay)))
  {
    SQLObject_list_ptr tmp1 = ListTran::tran_class<SQLExpr, SQLObject>(getArguments());
    acceptChild(visitor, tmp1);
  }
  visitor->endVisit(SharedObject(OracleDataTypeIntervalDay));
}

BOOL_ptr OracleDataTypeIntervalDay::isToSecond()
{
  return toSecond;
}

void OracleDataTypeIntervalDay::setToSecond(BOOL_ptr toSecond)
{
  this->toSecond = toSecond;
}

SQLExpr_list_ptr OracleDataTypeIntervalDay::getFractionalSeconds()
{
  return fractionalSeconds;
}

SQLObject_ptr OracleDataTypeIntervalDay::clone()
{
  SQLObject_ptr clone_tmp = std::shared_ptr<OracleDataTypeIntervalDay>(new OracleDataTypeIntervalDay());
  std::shared_ptr<OracleDataTypeIntervalDay> x = std::dynamic_pointer_cast<OracleDataTypeIntervalDay>(clone_tmp);
  // OracleDataTypeIntervalDay x = new OracleDataTypeIntervalDay();

  SQLDataTypeImpl::cloneTo(x);

  for (SQLExpr_ptr arg : *fractionalSeconds)
  {
    arg->setParent(x);
    x->fractionalSeconds->push_back(arg);
  }

  return x;
}
